package com.soulless.lazy;

import java.lang.reflect.Constructor;

/**
 * 懒汉式单例-静态内部类
 * <p>
 * ClassPath: LazyStaticInnerClassSingleton.class，LazyStaticInnerClassSingleton$LazyHolder.class。
 * 优点：
 *     写法优雅，利用了java本身语法特点，性能高，避免了内存浪费。
 * 缺点：
 *     能够被反射破坏。
 * </p>
 *
 * @author zenglei
 * @date 2022/11/16 23:34
 */
public class LazyStaticInnerClassSingleton {

    private LazyStaticInnerClassSingleton() {
        /**
         * 防止反射破坏
         */
        if (LazyHolder.INSTANCE != null) {
            throw new RuntimeException("不允许非法访问");
        }
    }

    private static LazyStaticInnerClassSingleton getInstance() {
        return LazyHolder.INSTANCE;
    }

    private static class LazyHolder {
        private static final LazyStaticInnerClassSingleton INSTANCE = new LazyStaticInnerClassSingleton();
    }

    //region 测试模块
    /**
     * 反射测试-单例
     *
     * <p>
     * {@link LazyStaticInnerClassSingleton}
     * </p>
     *
     * @author zenglei
     * @date 2022/11/16 23:41
     */
    static class ReflectTest {

        public static void main(String[] args) {
            try {
                Class<?> clazz = LazyStaticInnerClassSingleton.class;
                Constructor<?> c = clazz.getDeclaredConstructor(null);
                System.out.println(c);
                c.setAccessible(true);
                Object instance = c.newInstance();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }
    //endregion

}

